home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1999 July: Mac OS SDK / Dev.CD Jul 99 SDK1.toast / Development Kits / Mac OS / QuickDraw3D 1.6 SDK / Mac SampleCode New for 1.6 / WorldRayPickSample / Source / WRay_Menu.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-05-20  |  6.4 KB  |  404 lines  |  [TEXT/CWIE]

  1. /* 
  2.  *    WRay_Menu.c
  3.  *
  4.  *    QuickDraw 3D 1.6 Sample
  5.  *    Robert Dierkes
  6.  *
  7.  *     07/28/98    RDD        Created.
  8.  */
  9.  
  10. /*------------------*/
  11. /*    Include Files    */
  12. /*------------------*/
  13. #include "QD3D.h"
  14.  
  15. #if defined(OS_MACINTOSH) && OS_MACINTOSH
  16. #include <Devices.h>
  17. #include <Menus.h>
  18. #include <Dialogs.h>
  19. #include <Resources.h>
  20. #include <ToolUtils.h>
  21. #endif
  22.  
  23. #include "WRay_Error.h"
  24. #include "WRay_Document.h"
  25. #include "WRay_Main.h"
  26. #include "WRay_Menu.h"
  27. #include "WRay_Pick.h"
  28. #include "WRay_Scene.h"
  29. #include "WRay_System.h"
  30.  
  31.  
  32. /*------------------*/
  33. /*      Constants        */
  34. /*------------------*/
  35. #define    kMenuBarRsrcID        128
  36. #define    kAboutDialogRsrcID    128
  37.  
  38.  
  39. /*----------------------*/
  40. /*    Extern Declarations    */
  41. /*----------------------*/
  42. extern    TQ3Boolean    gTimeToQuit;
  43.  
  44.  
  45. /*----------------------*/
  46. /*    Global Declarations    */
  47. /*----------------------*/
  48. Handle        ghMenuBar = NULL;
  49.  
  50.  
  51. /*----------------------*/
  52. /*   Local Prototypes   */
  53. /*----------------------*/
  54. static
  55. TQ3Boolean Menu_Apple(
  56.             short            menuID,
  57.             short            itemNumber);
  58. static
  59. TQ3Boolean Menu_File(
  60.             short            itemNumber,
  61.             TDocumentPtr    pDoc);
  62. static
  63. TQ3Boolean Menu_Edit(
  64.             short            itemNumber,
  65.             TDocumentPtr    pDoc);
  66. static
  67. TQ3Boolean Menu_WorldRay(
  68.             short            menuID,
  69.             short            itemNumber,
  70.             TDocumentPtr    pDoc);
  71. static
  72. TQ3Boolean    Menu_AboutBox (
  73.             void);
  74.  
  75.  
  76.  
  77. /*
  78.  *    Menu_Initialize
  79.  */
  80. TQ3Boolean Menu_Initialize(
  81.             void)
  82. {
  83.     TQ3Boolean        goodMenus;
  84.  
  85.     goodMenus = kQ3True;
  86.  
  87.     /* Initialize MenuBar */
  88.     ghMenuBar = GetNewMBar (kMenuBarRsrcID);
  89.     if (ghMenuBar != NULL) {
  90.         SetMenuBar(ghMenuBar);
  91.         AppendResMenu(GetMenuHandle (mApple), (ResType) 'DRVR');
  92.         DrawMenuBar();
  93.     }
  94.     else {
  95.         ERROR_DEBUG_STR ("Menu_Initialize: Menu_Initialize: Couldn't find menu bar.");
  96.         ghMenuBar = NULL;
  97.         goodMenus = kQ3False;
  98.     }
  99.  
  100.      return (goodMenus);
  101. }
  102.  
  103.  
  104. /*
  105.  *    Menu_InitializeItems
  106.  *
  107.  *    Globals:
  108.  *        None
  109.  *
  110.  *    Menu_InitializeItems sets menu items based on these pDoc fields:
  111.  */
  112. TQ3Boolean Menu_InitializeItems(
  113.             TDocumentPtr    pDoc)
  114. {
  115.     MenuHandle        hMenu;
  116.  
  117.     #pragma unused(pDoc)
  118.  
  119.     DEBUG_ASSERT(pDoc != NULL, Menu_InitializeItems);
  120.  
  121.     /*
  122.      * mRay Menu
  123.      */
  124.     hMenu = GetMenuHandle(mRay);
  125.     DEBUG_ASSERT(hMenu != NULL, Menu_InitializeItems);
  126.     if (hMenu == NULL) {
  127.         return kQ3False;
  128.     }
  129.  
  130.     CheckItem(hMenu, iRayMoveBall, Pick_GetIsAnimating());
  131.     CheckItem(hMenu, iRayRotateCamera, Scene_IsRotating());
  132.     CheckItem(hMenu, Scene_GetRotationSpeed() + iRayRotateSlow, true);
  133.     CheckItem(hMenu, iRayShowLines, Scene_GetShowLines());
  134.     CheckItem(hMenu, iRaySound, System_GetSound());
  135.  
  136.     return kQ3True;
  137. }
  138.  
  139.  
  140. /*
  141.  *    Menu_Command
  142.  */
  143. TQ3Boolean Menu_Command (
  144.         long            menuResult,
  145.         TDocumentPtr    pDoc)
  146. {
  147.     TQ3Boolean    isOK = kQ3True;
  148.     short        menuID,
  149.                 itemNumber;
  150.  
  151.     if (menuResult == 0) {
  152.         return kQ3False;
  153.     }
  154.  
  155.     menuID       = HiWord (menuResult);
  156.     itemNumber = LoWord (menuResult);
  157.  
  158.     switch (menuID) {
  159.         case mApple:
  160.             isOK = Menu_Apple(menuID, itemNumber);
  161.             break;
  162.  
  163.         case mFile:
  164.             isOK = Menu_File(itemNumber, pDoc);
  165.             break;
  166.  
  167.         case mEdit:
  168.             isOK = Menu_Edit(itemNumber, pDoc);
  169.         break;
  170.  
  171.         case mRay:
  172.             isOK = Menu_WorldRay(menuID, itemNumber, pDoc);
  173.         break;
  174.  
  175.         default:
  176.             isOK = kQ3False;
  177.             break;
  178.  
  179.     }  /*  switch (menuID)  */
  180.  
  181.     HiliteMenu (0);
  182.  
  183.     return isOK;
  184. }
  185.  
  186.  
  187. #pragma mark -
  188.  
  189. /*
  190.  *    Menu_Apple
  191.  */
  192. static
  193. TQ3Boolean Menu_Apple(
  194.         short            menuID,
  195.         short            itemNumber)
  196. {
  197.     TQ3Boolean    isOK = kQ3True;
  198.  
  199.     switch (itemNumber)
  200.     {
  201.     case iAbout:
  202.         isOK = Menu_AboutBox();
  203.         break;
  204.  
  205.     default:
  206.         {
  207.             MenuHandle    hMenu;
  208.             Str255        deskAccName;
  209.             GrafPtr        oldPort;
  210.  
  211.             hMenu = GetMenuHandle (menuID);
  212.             if (hMenu != NULL) {
  213.                 GetPort (&oldPort);
  214.  
  215.                 GetMenuItemText (hMenu, itemNumber, deskAccName);
  216.                 (void) OpenDeskAcc (deskAccName);
  217.                 SetPort (oldPort);
  218.             }
  219.             else {
  220.                 isOK = kQ3False;
  221.             }
  222.         }
  223.         break;
  224.     }
  225.  
  226.     return isOK;
  227. }
  228.  
  229.  
  230. /*
  231.  *    Menu_File
  232.  */
  233. static
  234. TQ3Boolean Menu_File(
  235.         short            itemNumber,
  236.         TDocumentPtr    pDoc)
  237. {
  238.     TQ3Boolean    isOK = kQ3True;
  239.  
  240.     #pragma unused(pDoc)
  241.  
  242.     switch (itemNumber) {
  243.     case iNew:
  244.     case iOpen:
  245.     case iClose:
  246.     case iSave:
  247.     case iSaveAs:
  248.         isOK = kQ3False;/**/
  249.         break;
  250.  
  251.     case iQuit:
  252.         gTimeToQuit = kQ3True;
  253.         break;
  254.  
  255.     default:
  256.         System_Beep();
  257.         isOK = kQ3False;
  258.         break;
  259.     }
  260.  
  261.     return isOK;
  262. }
  263.  
  264.  
  265. /*
  266.  *    Menu_Edit
  267.  */
  268. static
  269. TQ3Boolean Menu_Edit(
  270.         short            itemNumber,
  271.         TDocumentPtr    pDoc)
  272. {
  273.     TQ3Boolean        isOK = kQ3True;
  274.  
  275.     #pragma unused (pDoc)
  276.  
  277.     if (! SystemEdit (itemNumber - 1)) {
  278.         switch (itemNumber) {
  279.         case iUndo:        break;
  280.         case iCut:        break;
  281.         case iCopy:        break;
  282.         case iPaste:    break;
  283.         case iClear:    break;
  284.         }
  285.     }
  286.  
  287.     return isOK;
  288. }
  289.  
  290.  
  291. /*
  292.  *    Menu_WorldRay
  293.  */
  294. static
  295. TQ3Boolean Menu_WorldRay(
  296.         short            menuID,
  297.         short            itemNumber,
  298.         TDocumentPtr    pDoc)
  299. {
  300.     TQ3Boolean        isOK = kQ3False;
  301.     MenuHandle        hMenu;
  302.  
  303.     DEBUG_ASSERT(pDoc != NULL, Menu_WorldRay);
  304.  
  305.     hMenu = GetMenuHandle(menuID);
  306.     DEBUG_ASSERT(hMenu != NULL, Menu_WorldRay);
  307.     if (hMenu == NULL) {
  308.         return kQ3False;
  309.     }
  310.  
  311.     switch (itemNumber) {
  312.  
  313.     case iRayMoveBall:
  314.         {
  315.             TQ3Boolean    newItemState;
  316.  
  317.             newItemState = Pick_GetIsAnimating() ? kQ3False : kQ3True;
  318.             CheckItem(hMenu, itemNumber, newItemState);
  319.             isOK = (Pick_SetIsAnimating(pDoc, newItemState) == kQ3Success) ? kQ3True : kQ3False;
  320.         }
  321.         break;
  322.  
  323.     case iRayRotateCamera:
  324.         {
  325.             CheckItem(hMenu, itemNumber, ! Scene_IsRotating());
  326.             Scene_SetIsRotating((Scene_IsRotating() == kQ3True) ? kQ3False : kQ3True);
  327.             isOK = kQ3True;
  328.         }
  329.         break;
  330.  
  331.     case iRayRotateSlow:
  332.     case iRayRotateMedium:
  333.     case iRayRotateFast:
  334.         {
  335.             TRotationSpeed    newRotationSpeed;
  336.  
  337.             newRotationSpeed = (TRotationSpeed) (itemNumber - iRayRotateSlow);
  338.  
  339.             CheckItem(hMenu, Scene_GetRotationSpeed() + iRayRotateSlow, false);
  340.             CheckItem(hMenu, newRotationSpeed + iRayRotateSlow, true);
  341.             Scene_SetRotationSpeed(newRotationSpeed);
  342.             isOK = kQ3True;
  343.         }
  344.         break;
  345.  
  346.     case iRayShowLines:
  347.         {
  348.             CheckItem(hMenu, itemNumber, ! Scene_GetShowLines());
  349.             Scene_SetShowLines((Scene_GetShowLines() == kQ3True) ? kQ3False : kQ3True);
  350.             isOK = kQ3True;
  351.         }
  352.         break;
  353.  
  354.     case iRaySound:
  355.         {
  356.             TQ3Boolean    newItemState;
  357.  
  358.             newItemState = System_GetSound() ? kQ3False : kQ3True;
  359.             CheckItem(hMenu, itemNumber, newItemState);
  360.             System_SetSound(newItemState);
  361.             isOK = kQ3True;
  362.         }
  363.         break;
  364.  
  365.     default:
  366.         {
  367.             System_Beep();
  368.             isOK = kQ3False;
  369.         }
  370.         break;
  371.     }
  372.  
  373.     return isOK;
  374. }
  375.  
  376.  
  377.  
  378. #pragma mark -
  379.  
  380. /*
  381.  *    Menu_AboutBox
  382.  */
  383. static
  384. TQ3Boolean Menu_AboutBox (void)
  385. {
  386.     TQ3Boolean    isOK = kQ3True;
  387.     DialogPtr    theDialog;
  388.     short        itemHit;
  389.  
  390.     theDialog = GetNewDialog(kAboutDialogRsrcID, NULL, kWindowOnTop);
  391.     if (theDialog == NULL)
  392.         return kQ3False;
  393.  
  394.     do {
  395.         ModalDialog (NULL, &itemHit);
  396.     }
  397.     while (itemHit != ok);
  398.  
  399.     DisposeDialog (theDialog);
  400.  
  401.     return isOK;
  402. }
  403.  
  404.